#ifndef CENARIO_H
#define CENARIO_H
#include "agente.h"
#include "obstaculo.h"
#include "waypoint.h"
#include "objetivo.h"
#include "nonplayablecharacter.h"
#include <stdlib.h>
#include <vector>
#include <math.h>

#define TAMANHO_GRID 101
#define OBSTACULO_GRID 50000
#define VAZIO_GRID 9999
//raio o raio do objeto ou metade do lado caso seja um quadrado
#define TAMANHO_OBSTACULO 2

using namespace std;

class Cenario
{

public:
    Cenario();
    void addAgente(Agente *agente);
    void addObjetivo(Objetivo *objetivo);
    void addObstaculo(Obstaculo *obstaculo);
    void addNPC(NonPlayableCharacter *NPC);
    void addWaypoint(Waypoint *waypoint);
    void removeElemento(int x, int y);
    void removeAgente(int x, int y);
    void removeObjetivo(int x, int y);
    void removeObstaculo(int x,int y);
    void removeNPC(int x,int y);
    void removeWaypoint(int x,int y);
    void limpaCenario();
    Agente* getAgente();
    Objetivo* getObjetivo();
    Obstaculo* getObstaculo(int indice);
    int getListadeObstaculosSize();
    NonPlayableCharacter* getNPC(int indice);
    int getListadeNPCsSize();
    Waypoint* getWaypoint(int indice);
    int getListadeWaypointsSize();
    void atualizaGrid();
    void atualizaVizinhos(int x,int y,int dist);
    void zeraGrid();
    void Cenario::zeraGridA();
    int getGridValue( int x, int y);
    int **getGrid();
    void setGridValue( int x, int y, int valor);
    void atualizaObstaculoGrid(int x ,int y);
    bool detectaColisao(int x , int y, int tamanho);

private:
    Agente *agente;
    Objetivo *objetivo;
    vector <Obstaculo*> listaDeObstaculos;
    vector <NonPlayableCharacter*> listaDeNPCs;
    vector <Waypoint*> listaDeWaypoints;
    int **grid;

};

#endif // CENARIO_H
